// 821. 字符的最短距离
/**
 * 总体思路 双数组 双指针
 *
 * 先获取到对应的字母位于数组中的所有下标idxs
 * 重新遍历 s，从idxs[0]和idxs[1]开始，用 last 和next存储当前对比的下标，
 * idx 存储当前对比的索引，用当前下标对比，取 prev-i 和 next-i的绝对值中较小的一个放入结果中
 * 当i === next的时候， -重置last, next ,idx
 */
export function shortestToChar(s: string, c: string): number[] {
  if(!s.length) return []
  let res: number[] = []
  let idxs: number[] = []
  for (let i = 0; i < s.length; i++) {
    if (s[i] === c) idxs.push(i)
  }
  if(!idxs.length) return []
  idxs.push(999999999)
  let prev = idxs[0]
  let next = idxs[1]
  let idx = 1
  for (let i = 0; i < s.length; i++) {
    // 这一步技巧
    res.push(Math.min(Math.abs(prev-i),next-i))
    if (i === next) {
      prev = next
      idx++
      next = idxs[idx]
    }
  }
  return res
}
// console.log(shortestToChar('abc', 'e'));
/**
 * 还是错了。在取 i - index[0] 和 i - index[1]的绝对值中较小的一个放入结果中没弄明白；
 * @param s
 * @param c

 function shortestToChar(s: string, c: string): number[] {
  let res: number[] = []
  let i = 0; //
  let j = -1; // 记录上一个 c 的位置
  let n = 0;
  let resBack: number[] = [];//  缓存
  for (; i < s.length; i++) {
    if (s[i] === c) {
      const abs = Math.abs(i - j)
      if (abs === 0) {
        res.push(0)
      } else {
        if (j < 0) {
          n = i
          for (let k = n; k > 0; k--) {
            resBack.push(k)
          }
          res = resBack.reverse().concat(res)
          n = 0
          resBack = []
        }
        if (j >= 0 && j < i) {
          n = abs % 2 ? abs : abs + 1
          let midkey = Math.floor(n / 2)
          for (let k = 1; k < midkey; k++) {
            resBack.push(k)
          }
          for (let k = midkey; k > 0; k--) {
            resBack.push(k)
          }
          res = resBack.concat(res)
          n = 0
          resBack = []
        }
        if (j === i) {
          res.push(0)
        }
        j = i
      }
    }
  }
  return res
};
 */
// console.log(shortestToChar('loveleetcode', 'e'));
